package yasuoliu;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class demo3 {
    //目的： 把aaa文件夹压缩成aaa.zip
    public static void main(String[] args) throws IOException {
        //1.创建被压缩文件夹的对象
        File src = new File("E:\\aaa");
        //2.创建压缩文件对象
        File dest = new File("E:\\" + src.getName() + ".zip");
        //创建压缩流关联压缩包
        //3.创建好了压缩包
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //4.调用压缩方法

        ToZip(src, zos, src.getName());
        zos.close();
    }

    private static void ToZip(File src, ZipOutputStream zos, String name) throws IOException {

        //1.进入src文件下
        File[] files = src.listFiles();
        //2.遍历数组获取src下的文件或者文件夹
        for (File file : files) {
            if (file.isFile()) {
                //如果是文件，就在压缩包下创建同名字的文件，并且把src下的文件内容写入到压缩包下的文件
                //把src下的文件变成Zipentry对象
                //3.获取src下的文件，变成ZipEntry对象，放入到压缩包里面


                //如果entry内的路径是aaa\\a.txt路径，他就先创建aaa再创建a.txt
                ZipEntry entry = new ZipEntry(name + "\\" + file.getName());//创建好了aaa\\a.txt
                System.out.println(entry);
                /*
                细节：
                         这个String name的变量就是为了创建父级路径
                         什么意思： ZipEntry entry = new ZipEntry("aaa\\bbb\\a.txt)
                          如果是文件，那么父级路径就是aaa\\bbb
                          打印entry也会打印父级路径 如：aaa\\bbb\\a.txt

                          总结： Zipentry对象参数有多少文件夹或者文件就创建多少个
                 */
                //此时的entry表示src下的文件
                //获取src下的文件名，并把他放入压缩包中
                zos.putNextEntry(entry);
                //读取src下的文件内容，并写入到压缩包下的文件中
                FileInputStream fis = new FileInputStream(file);
                int b;
                while ((b = fis.read()) != -1) {
                    zos.write(b);
                }

                fis.close();
                zos.closeEntry();

            } else {

                //如果是文件夹，就在压缩包下创建同名字的文件夹，并且递归调用方法

                ToZip(file, zos, name + "\\" + file.getName());    //      aaa\\bbb

            }
        }


    }
}
